home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Hot Mix 17
/
Hot Mix 17.iso
/
HM17_SGI
/
research
/
lib
/
search2d.pro
< prev
next >
Wrap
Text File
|
1997-07-08
|
6KB
|
154 lines
; $Id: search2d.pro,v 1.5 1997/01/15 03:11:50 ali Exp $
; Copyright (c) 1992-1997, Research Systems, Inc. All rights reserved.
; Unauthorized reproduction prohibited.
;
;+
; NAME:
; SEARCH2D
;
; PURPOSE:
; This function finds "objects" or regions of similar data
; values within a 2-D array of data. Given a starting location
; and a range of values to search for, SEARCH2D will find all
; the cells within the array that are within the specified range
; of values, and have some path of connectivity through these cells
; to the starting location. See the procedure "SEARCH3D" for the
; three dimensional case.
;
; This function returns a list of the array subscripts that define
; the selected object or region.
;
; CATEGORY:
; Data subsetting.
; Image manipulation.
;
; CALLING SEQUENCE:
; Region = SEARCH2D(Array, Xpos, Ypos, Min_val, Max_val)
;
; INPUTS:
; Array: The 2-D array of data to search.
; Data type : Any 2-D array except string or structure.
; Xpos: The X coordinate(s) (first subscript into the 2-D Array)
; of the seed point(s) for the search. Xpos can be a
; single value, or an array of subscripts specifying the
; X coordinates of a seed region. Xpos must have the same
; number of elements as Ypos.
; Data type : Long or Lonarr.
; Ypos: The Y coordinate(s) (second subscript into the 2-D Array)
; of the seed point(s) for the search. Ypos can be a
; single value, or an array of subscripts specifying the
; Y coordinates of a seed region. Ypos must have the same
; number of elements as Xpos.
; Data type : Long or Lonarr.
; Min_val: The minimum data value to search for. All cells that
; are connected to the starting cell, and have a value
; greater than or equal to Min_val and less than or equal
; to Max_val, will be considered part of the "object".
; If omitted, the default is MIN(Array[Xpos, Ypos]) .
; Max_val: The maximum data value to search for.
; If omitted, the default is MAX(Array[Xpos, Ypos]) .
;
; KEYWORD PARAMETERS:
; IMAGE: If set, SEARCH2D returns a bi-level image (2-D byte array)
; with the same dimensions as Array, containing the value
; (1) where the object is, and (0) where it isn't.
;
; DIAGONAL: This keyword is now obsolete since LABEL_REGION is now
; used to find the object.
; DECREASE: This keyword is now obsolete as are INCREASE and LPF_BAND.
; A better way to perform this operation is to pre-process
; the Array parameter before passing to SEARCH2D.
; INCREASE: See the DECREASE keyword.
; LPF_BAND: See the DECREASE keyword.
;
; OUTPUTS:
; This function returns a list of the indices into the 2-D array
; that are part of the located object or region. This list is
; returned as a LONARR(n) where n is the number of cells found.
;
; If the returned array of indices is called Region, and the
; size of the 2-D array of data is size_x by size_y, then the
; actual X and Y indices can be obtained by using the following
; algorithm :
;
; index_y = Region / size_x
; index_x = Region - (index_y * size_x)
;
; The object within the 2-D Array could then be subscripted as :
;
; Array[Region]
; OR
; Array[index_x, index_y]
;
; If the IMAGE keyword is set, however, SEARCH2D returns a bi-level
; image (2-D byte array) with the same dimensions as Array, containing
; the value (1) where the object is, and (0) where it isn't.
;
; EXAMPLE:
; Find all the indices corresponding to an object contained in a
; 2-D array of data.
;
; ; Create some data.
; img = FLTARR(512, 512)
; img[3:503, 9:488] = 0.7
; img[37:455, 18:438] = 0.5
; img[144:388, 90:400] = 0.7
; img[200:301, 1:255] = 1.0
; img[155:193, 333:387] = 0.3
;
; ; Display the image.
; TVSCL, img
;
; ; Search for an object starting at (175, 300) whose data values
; ; are between (0.6) and (0.8).
; object = SEARCH2D(img, 175, 300, 0.6, 0.8, /IMAGE)
;
; ; Display the object.
; TVSCL, object
;
; MODIFICATION HISTORY:
; Written by: Daniel Carr. Thu Sep 3 15:36:17 MDT 1992
; Modified: Daniel Carr.
; Re-wrote to improve performance using "LABEL_REGION".
; Obsoleted keywords INCREASE, DECREASE, and LPF_BAND.
; Added IMAGE keyword.
;-
FUNCTION Search2d, array, xpos, ypos, min_val, max_val, Diagonal=diagonal, $
Image=image, Decrease=decrease, Increase=increase, $
Lpf_band=smooth_band
ON_ERROR, 2
IF (Keyword_Set(diagonal)) THEN $
Print, 'Search2D: Obsolete keyword "DIAGONAL" ignored.'
IF (N_Elements(decrease) GT 0L) THEN $
Print, 'Search2D: Obsolete keyword "DECREASE" ignored.'
IF (N_Elements(increase) GT 0L) THEN $
Print, 'Search2D: Obsolete keyword "INCREASE" ignored.'
IF (N_Elements(smooth_band) GT 0L) THEN $
Print, 'Search2D: Obsolete keyword "LPF_BAND" ignored.'
IF (N_Elements(min_val) LE 0L) THEN min_val = MIN(array[xpos, ypos], Max=max_val)
IF (N_Elements(max_val) LE 0L) THEN max_val = MAX(array[xpos, ypos])
size_array = Size(array)
s_array = Bytarr(size_array[1], size_array[2])
index = Where((array GE min_val) AND (array LE max_val))
IF (index[0] GE 0L) THEN s_array[Temporary(index)] = 1B
s_array[xpos, ypos] = 1B
s_array = Label_Region(Temporary(s_array))
seed_point = s_array[xpos[0], ypos[0]]
index = Where(Temporary(s_array) eq seed_point)
IF (Keyword_Set(image)) THEN BEGIN
s_array = Bytarr(size_array[1], size_array[2])
IF (index[0] GE 0L) THEN s_array[Temporary(index)] = 1B
RETURN, s_array
ENDIF ELSE RETURN, index
END